package cn.lystudio.rohmtimeopwide_background_v11.entity.vo;


import cn.lystudio.rohmtimeopwide_background_v11.enums.ApiStatus;
import cn.lystudio.rohmtimeopwide_background_v11.exceptions.BaseException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ApiResponse {
    // 状态码
    private Integer code;
    // 状态信息
    private String message;
    // 状态数据
    private Object data;

    /**
     * 完全自定义一个API数据模型
     * @return API模型
     */
    private static ApiResponse of(Integer code, String message, Object data) {
        return new ApiResponse(code, message, data);
    }

    /**
     *  通过status返回ApiResponse对象
     * @param status
     * @param data
     * @return
     */
    private static ApiResponse ofStatus(ApiStatus status, Object data) {
        return of(status.getCode(), status.getMessage(), data);
    }

    /**
     *  请求成功的API返回, 只携带数据
     * @param data
     * @return
     */
    public static ApiResponse ofSuccessData(Object data) {
        return ofStatus(ApiStatus.OK, data);
    }

    /**
     *  请求成功的API, 只携带自定义msg, 这个不用
     * @param message
     * @return
     */
    public static ApiResponse ofSuccessMessage(String message) {
        return of(ApiStatus.OK.getCode(), message, null);
    }

    /**
     * 构造一个异常的ApiResponse, 且携带数据
     * <T extends BaseException> : T类型必须继承异常基类
     * @param t
     * @param data
     * @param <T>
     * @return
     */
    public static <T extends BaseException> ApiResponse ofException(T t, Object data) {
        return of(t.getCode(), t.getMessage(), data);
    }

    /**
     * 构造一个异常的ApiResponse,不携带数据
     *
     * @param t   异常
     * @param <T> {@link BaseException} 的子类
     * @return ApiResponse
     */
    public static <T extends BaseException> ApiResponse ofException(T t) {
        return ofException(t, null);
    }

}
